package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IUserRoleCompanyDAO;
import org.jsola.hr.dto.UserRoleCompanyAddDTO;
import org.jsola.hr.dto.UserRoleCompanyUpdateDTO;
import org.jsola.hr.entity.UserRoleCompanyDO;
import org.jsola.hr.query.UserRoleCompanyQuery;
import org.jsola.hr.vo.UserRoleCompanyListVO;
import org.jsola.hr.vo.UserRoleCompanyVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 人员分管用工单位
 *
 * @author zhr
 */
public interface IUserRoleCompanyService extends IService<IUserRoleCompanyDAO, UserRoleCompanyDO> {

    /**
     * 新增人员分管用工单位
     *
     * @param userRoleCompanyAddDTO 新增人员分管用工单位DTO
     * @param tokenUser             当前用户
     * @return 人员分管用工单位详情信息
     */
    UserRoleCompanyVO save(UserRoleCompanyAddDTO userRoleCompanyAddDTO, TokenUser tokenUser);

    /**
     * 批量新增人员分管用工单位
     *
     * @param userRoleCompanyAddDTOList 新增人员分管用工单位DTO
     * @param tokenUser                 当前用户
     * @return 人员分管用工单位详情信息
     */
    List<UserRoleCompanyVO> batchSave(List<UserRoleCompanyAddDTO> userRoleCompanyAddDTOList, TokenUser tokenUser);

    /**
     * 修改人员分管用工单位
     *
     * @param userRoleCompanyUpdateDTO 修改人员分管用工单位DTO
     * @param tokenUser                当前用户
     * @return 更新数量
     */
    int update(UserRoleCompanyUpdateDTO userRoleCompanyUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除人员分管用工单位，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser          当前用户
     * @param userRoleCompanyIds 人员分管用工单位id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... userRoleCompanyIds);

    /**
     * 根据人员分管用工单位id查找
     *
     * @param userRoleCompanyId 人员分管用工单位id
     * @param siteId            所属站点id
     * @return 人员分管用工单位详情信息
     */
    UserRoleCompanyVO selectById(String userRoleCompanyId, String siteId);

    /**
     * 查询人员分管用工单位
     *
     * @param userRoleCompanyQuery 查询条件
     * @param siteId               所属站点id
     * @return 人员分管用工单位列表信息
     */
    List<UserRoleCompanyListVO> select(UserRoleCompanyQuery userRoleCompanyQuery, String siteId);

    /**
     * 查询站点下人员分管用工单位 已删除的也查询
     * @param siteId 所属站点id
     * @return 人员分管用工单位
     */
    List<UserRoleCompanyDO> selectBySiteId(String siteId);

    /**
     * 查询站点下人员分管用工单位 已删除的也查询
     * @param siteId 所属站点id
     * @return 人员分管用工单位
     */
    List<UserRoleCompanyDO> selectBySiteIdNotValid(String siteId);

    /**
     * 查询人员分管用工单位记录数
     *
     * @param userRoleCompanyQuery 查询条件
     * @param siteId               所属站点id
     * @return 人员分管用工单位记录数
     */
    int selectCount(UserRoleCompanyQuery userRoleCompanyQuery, String siteId);

    /**
     * 分页查询人员分管用工单位
     *
     * @param userRoleCompanyQuery 查询条件
     * @param siteId               所属站点id
     * @return 人员分管用工单位列表信息
     */
    Page<UserRoleCompanyListVO> selectPage(UserRoleCompanyQuery userRoleCompanyQuery, String siteId);


    /**
     * 根据人员分管用工单位id查找
     *
     * @param userRoleCompanyId 人员分管用工单位id
     * @param siteId            所属站点id
     * @return 人员分管用工单位
     */
    UserRoleCompanyDO selectDOById(String userRoleCompanyId, String siteId);

    /**
     * 查询人员分管用工单位
     *
     * @param userRoleCompanyQuery 查询条件
     * @param siteId               所属站点id
     * @return 人员分管用工单位列表
     */
    List<UserRoleCompanyDO> selectDO(UserRoleCompanyQuery userRoleCompanyQuery, String siteId);

    /**
     * 根据信息查询某人员在某分公司下分管的用工单位
     *
     * @param userId         用户id
     * @param roleId         角色id
     * @param childCompanyId 分公司id,总公司是supreme
     * @param siteId         当前站点
     * @return 某人员在某分公司下分管的用工单位
     */
    List<UserRoleCompanyDO> listByUserAndRoleAndChildCompany(String userId, Long roleId, String childCompanyId, String siteId);


    /**
     * 根据信息查询某人员在某分公司下分管的用工单位
     *
     * @param userId         用户id
     * @param childCompanyId 分公司id,总公司是supreme
     * @param siteId         当前站点
     * @return 某人员在某分公司下分管的用工单位
     */
    List<UserRoleCompanyDO> listByUserAndChildCompany(String userId, String childCompanyId, String siteId);


    /**
     * 查询在某分公司下分管的用工单位
     *
     * @param childCompanyId 分公司id,总公司是supreme
     * @param siteId         当前站点
     * @return 某人员在某分公司下分管的用工单位
     */
    List<UserRoleCompanyDO> selectByChildCompany(String childCompanyId, String siteId);

    /**
     * 添加某用户在某用工单位下有权限的用工单位
     *
     * @param userId             用户id
     * @param roleId             角色id
     * @param isAllEmployer      是否为总公司权限
     * @param childCompanyIdList 用工单位分组ids
     * @param employerIdList     用工单位ids
     * @param tokenUser          当前用户
     */
    void add(String userId, Long roleId, Boolean isAllEmployer, List<String> childCompanyIdList, List<String> employerIdList, TokenUser tokenUser);


    /**
     * 删除用户在站点下权限的用工单位
     *
     * @param userIds 用户Id
     * @param siteId  站点Id
     * @return 删除条数
     */
    int deleteByUserIdAndSiteId(List<String> userIds, String siteId);

    /**
     * 筛选在用工单位中有权限的用户
     *
     * @param companyId 用工单位id
     * @param siteId    站点
     * @return 在用工单位有权限的用户
     */
    List<UserRoleCompanyDO> screenHasRoleUserInCompany(String companyId, String siteId);


    /**
     * 查看用户在公司拥有的权限
     *
     * @param userId 用户Id
     * @param siteId 公司Id
     * @return 用户在公司拥有的权限
     */
    List<UserRoleCompanyDO> selectByUserId(String userId, String siteId);

    /**
     * 查看用户在公司指定角色拥有的权限
     *
     * @param userId 用户Id
     * @param roleId 角色Id
     * @param siteId 公司Id
     * @return 用户在公司拥有的权限
     */
    List<UserRoleCompanyDO> selectByUserIdAndRoleId(String userId, Long roleId, String siteId);

    /**
     * 查看用户在公司拥有的权限
     *
     * @param userIds 用户Id
     * @param siteId  公司Id
     * @return 用户在公司拥有的权限
     */
    List<UserRoleCompanyDO> selectByUserIds(List<String> userIds, String siteId);

    /**
     * 查询拥有某公司权限的用户列表
     *
     * @param groupIds  用工单位分组Id
     * @param companyId 用工单位Id
     * @param siteId    公司Id
     * @return 用户在公司拥有的权限
     */
    List<UserRoleCompanyDO> selectByCompanyIdOrGroupIds(List<String> groupIds, String companyId, String siteId);

    /**
     * 查询拥有某些公司权限的用户列表
     *
     * @param groupIds      用工单位分组Id
     * @param companyIdList 用工单位Id集合
     * @param siteId        公司Id
     * @return 用户在公司拥有的权限
     */
    List<UserRoleCompanyDO> selectByCompanyIdListOrGroupIds(List<String> groupIds, List<String> companyIdList, String siteId);


    /**
     * 有其他权限的员工
     *
     * @param childCompanyIds 用工单位分组Id
     * @param employerIds     用工单位Id
     * @param siteId          站点Id
     * @return 员工Ids
     */
    List<String> selectNotInChildCompanyIdsAndEmployerIds(List<String> childCompanyIds, List<String> employerIds, String siteId);


    /**
     * 查询某公司下的管理员
     *
     * @param companyId 用工单位Id
     * @param siteId    站点Id
     * @return 管理员
     */
    List<UserRoleCompanyDO> selectUserByCompanyId(String companyId, String siteId);
}


